/**
 * @file sms4.h
 * @brief 实现国密sms4对称加密算法，算法描述参考《无线局域网产品使用的SMS4密码算法》
 * @license BSD
 */

#ifndef SM_SMS4_H
#define SM_SMS4_H

#include <stdint.h>

#ifdef __cpluscplus
extern "C" {
#endif

/** 加密数据块的大小 */
#define SMS4_BLOCK_SIZE 16

/** SMS4算法工作区 */
typedef struct SMS4_WorkArea_st {
	uint32_t rk[32];	//!< 轮密码，由密码生成，参考1.4节
} SMS4_WorkArea;

/**
 * 初始化SMS4加密算法的工作区
 * @param [out] sms4 算法工作区
 * @param [in] 密钥，长度为SMS4_BLOCK_SIZE
 */
void SMS4_Initialize(SMS4_WorkArea *sms4, const uint8_t pw[SMS4_BLOCK_SIZE]);

/**
 * 使用SMS4算法加密一个数据块
 * @param [in] sms4 算法工作区，含有密钥信息
 * @param [in] plain 明文数据
 * @param [out] cipher 密文数据
 */
void SMS4_Encrypt(const SMS4_WorkArea *sms4, const uint8_t plain[SMS4_BLOCK_SIZE], uint8_t cipher[SMS4_BLOCK_SIZE]);

/**
 * 使用SMS4算法解密一个数据块
 * @param [in] sms4 算法工作区，含有密钥信息
 * @param [in] cipher 密文数据
 * @param [out] plain 明文数据
 */
void SMS4_Decrypt(const SMS4_WorkArea *sms4, const uint8_t cipher[SMS4_BLOCK_SIZE], uint8_t plain[SMS4_BLOCK_SIZE]);

/** 销毁算法工作区 */
void SMS4_Finalize(SMS4_WorkArea *sms4);


#ifdef __cpluscplus
} // extern "C" {
#endif

#endif // SM_SMS4_H
